===== SLIDE 1 ===== 单元7 Hive性能优化 ===== SLIDE 2 ===== 学习目标/Target 掌握存储优化,能够灵活运用不同文件格式和压缩方式的组合提高数据存储效率与查询性能。 了解参数优化,能够通过调整Hive参数配置优化查询性能。 熟悉HiveQL语句优化技巧,能够通过合理编写HiveQL语句提升查询效率。 ===== SLIDE 3 ===== 单元概述/ Summary 在实际的大数据分析中,Hive的执行性能不仅依赖底层硬件资源和执行引擎,还与数据存储方式、参数配置以及HiveQL语句的编写习惯密切相关。合理的存储方式能够减少I/O开销、提升查询效率;针对性的参数调整可以在性能、稳定性与资源利用率之间取得平衡;而高效的HiveQL语句则能避免冗余计算,在不改动底层配置的情况下显著加快查询执行。本单元将从这3个方面介绍Hive的优化。 ===== SLIDE 4 ===== 目录/Contents 01 02 03 任务:优化数据存储 任务:优化配置参数 任务:优化执行语句 ===== SLIDE 5 ===== 任务:优化数据存储 7.1 ===== SLIDE 6 ===== 7.1 任务:优化数据存储 掌握存储优化,能够灵活运用不同文件格式和压缩方式的组合提高数据存储效率与查询性能。 学习目标 ===== SLIDE 7 ===== Hive的数据存储本质上依赖于HDFS,所有数据的读写都基于HDFS文件完成。为提升文件的读写性能,Hive提供了多种存储格式,不同文件格式在存储效率与查询性能上的差异,直接决定了后续优化空间的大小。基于此,在建表时选择合适的文件格式就成为Hive优化的重要起点。不过,单靠文件格式往往难以达到最佳效果,还需要结合合适的压缩方式,以进一步降低存储空间、减少I/O开销,从而显著提升资源利用率和查询性能。 7.1 任务:优化数据存储 ===== SLIDE 8 ===== 下面将分别介绍Hive中常用的文件格式和压缩方式,具体内容如下。 7.1 任务:优化数据存储 压缩 方式 文件 格式 ===== SLIDE 9 ===== Hive常用的文件格式包括TEXTFILE、ORC和PARQUET,其中TEXTFILE具有良好的可读性和兼容性,但压缩率较低、查询性能较弱,通常适用于小规模数据分析或数据导入场景。ORC为大数据处理优化设计,支持高效压缩与快速查询,是Hive官方推荐的文件格式。PARQUET与ORC类似,同样采用列式存储,但更注重跨平台兼容性,在不同大数据组件之间具有更好的通用性。 1. 常用的文件格式 7.1 任务:优化数据存储 ===== SLIDE 10 ===== Hive常用的压缩方式包括Snappy、zlib、LZO和Zstandard(Zstd),每种压缩方式具有不同的特点,具体介绍如下。 2. 常用的压缩格式 7.1 任务:优化数据存储 1 LZO的压缩与解压速度较快,压缩率介于Snappy与zlib之间,适合大文件的并行处理。 Snappy的压缩与解压速度快,可显著提升读写性能,但压缩率适中,适用于对查询性能要求较高的场景。 2 3 zlib的压缩率高,但压缩与解压速度较慢,适用于以节省存储空间为主要目标的场景。 Zstandard的压缩率通常优于zlib,解压速度接近Snappy,但压缩速度略低于Snappy,兼顾压缩率与性能。 4 ===== SLIDE 11 ===== 例如,在Hive中创建文件格式为ORC且压缩方式为Snappy的表ecommerce_orders,具体HiveQL语句如下。 7.1 任务:优化数据存储 点击查看 ===== SLIDE 12 ===== 任务:优化配置参数 7.2 ===== SLIDE 13 ===== 7.2 任务:优化配置参数 了解参数优化,能够通过调整Hive参数配置优化查询性能。 学习目标 ===== SLIDE 14 ===== Hive的配置文件中包含大量参数,其中大多采用默认值以兼顾常见场景。但在实际应用中,由于数据规模、硬件环境等因素各不相同,仅依赖默认配置往往难以在性能、稳定性和资源利用率之间取得最佳平衡。因此,进行针对性的参数优化就显得尤为关键。参数优化不仅是提升Hive性能的重要手段,也是保障大规模数据分析顺利完成的基础。本任务将介绍Hive中常用的参数优化方法,具体内容如下。 并行执行 分组优化 本地模式 中间数据压缩 参数 优化 7.2 任务:优化配置参数 ===== SLIDE 15 ===== 1.并行执行 7.2 任务:优化配置参数 并行执行是指允许多个彼此无依赖关系的任务同时运行,从而缩短整个查询语句的执行时间。例如,表连接前的子查询处理,或多条插入操作中的文件移动,都可以并行执行。 在Hive中,并行执行由参数hive.exec.parallel控制,该参数默认值为false,表示关闭并行执行,此时无依赖关系的任务会依次顺序执行。若要开启并行执行,则需将参数hive.exec.parallel的值设置为true。 ===== SLIDE 16 ===== 1.并行执行 如果希望在当前会话中临时开启并行执行,那么可以执行如下HiveQL语句。 SET hive.exec.parallel=true; 7.2 任务:优化配置参数 如果希望永久开启并行执行,那么可以Hive配置文件中添加如下参数。 hive.exec.parallel true ===== SLIDE 17 ===== 本地模式是指允许Hive自动将查询切换为在本地任务中执行,而不是提交到YARN集群,从而减少集群资源的消耗。例如,在处理小规模数据的聚合查询时,默认情况下Hive仍会将任务提交到YARN集群执行。 2.本地模式 7.2 任务:优化配置参数 ===== SLIDE 18 ===== 2.本地模式 7.2 任务:优化配置参数 在Hive中,本地模式由参数hive.exec.mode.local.auto控制,该参数默认值为false,表示关闭本地模式,此时Hive不会自动切换到本地任务。若要开启本地模式,则需将参数hive.exec.mode.local.auto的值设置为true。 ===== SLIDE 19 ===== 如果希望在当前会话中临时开启本地模式,那么可以执行如下HiveQL语句。 SET hive.exec.mode.local.auto=true; 7.2 任务:优化配置参数 如果希望永久开启本地模式,那么可以在Hive配置文件中添加如下参数。 hive.exec.mode.local.auto true 2.本地模式 ===== SLIDE 20 ===== 在开启本地模式时,Hive会根据以下条件判断是否将查询作为本地任务执行。 7.2 任务:优化配置参数 2.本地模式 1 聚合阶段的并行任务数小于等于1。 输入数据的总字节数小于等于134217728字节,该条件由参数hive.exec.mode.local.auto.inputbytes.max控制。 2 3 输入数据阶段的文件数小于等于4,该条件由参数hive.exec.mode.local.auto.input.files.max控制。 ===== SLIDE 21 ===== 在Hive中执行分组查询时,输入阶段的任务会根据分组字段的值,通过Shuffle将相同分组的数据分发到下游任务中执行。当分组字段的某些取值出现频率远高于其他值时,容易引发数据倾斜,导致部分下游任务的数据量过大。 3.分组优化 7.2 任务:优化配置参数 ===== SLIDE 22 ===== 7.2 任务:优化配置参数 为缓解这一问题,可以通过参数hive.groupby.skewindata开启分组优化,该参数的默认值为false,表示关闭分组优化。若要开启分组优化,则需将参数hive.groupby.skewindata的值设置为true。 3.分组优化 ===== SLIDE 23 ===== 如果希望在当前会话中临时开启分组优化,那么可以执行如下HiveQL语句。 SET hive.groupby.skewindata=true; 7.2 任务:优化配置参数 如果希望永久开启分组优化,那么可以Hive配置文件中添加如下参数。 hive.groupby.skewindata true 3.分组优化 ===== SLIDE 24 ===== 4.中间数据压缩 7.2 任务:优化配置参数 中间数据压缩是指在查询过程中,对产生的中间结果使用指定的压缩方式进行压缩。对于体量巨大的中间数据,这种方式能够显著减少磁盘I/O和网络带宽的消耗,但代价是需要占用更多的CPU资源来完成压缩与解压操作。 ===== SLIDE 25 ===== 当Hive使用Tez作为执行引擎时,中间数据压缩主要受以下三个参数控制。 7.2 任务:优化配置参数 1 参数tez.runtime.compress.codec用于指定Tez使用的压缩方式,该参数默认值为空,表示不会对中间数据进行压缩。 参数hive.exec.compress.intermediate用于开启Hive层面的中间数据压缩,该参数默认值为false,表示关闭中间数据压缩。 2 3 参数tez.runtime.compress用于开启Tez运行时对中间数据进行压缩,该参数默认值为空,表示关闭中间数据压缩。若要开启中间数据压缩,则需将参数tez.runtime.compress的值设置为true。 4.中间数据压缩 ===== SLIDE 26 ===== 如果希望在当前会话中临时开启中间数据压缩,那么可以执行下列HiveQL语句。 SET hive.exec.compress.intermediate=true; SET tez.runtime.compress=true; SET tez.runtime.compress.codec=org.apache.hadoop.io.compress.SnappyCodec; 7.2 任务:优化配置参数 4.中间数据压缩 ===== SLIDE 27 ===== 在Hive配置文件中添加完上述参数之后,还需要在Tez安装目录的conf目录下,新建一个配置文件tez-site.xml,然后在该文件中添加如下内容。 7.2 任务:优化配置参数 4.中间数据压缩 点击查看 ===== SLIDE 28 ===== 任务:优化执行语句 7.3 ===== SLIDE 29 ===== 7.3 任务:优化执行语句 熟悉HiveQL语句优化技巧,能够通过合理编写HiveQL语句提升查询效率。 学习目标 ===== SLIDE 30 ===== 在Hive的实际应用中,HiveQL语句的书写方式对查询性能有着直接影响。即使底层参数配置合理,如果语句本身存在冗余计算或不合理的逻辑,依旧可能导致作业运行缓慢、资源消耗过大。掌握语句优化技巧,可以在不修改数据存储格式和底层配置的情况下,显著提升查询效率。下面将介绍五种常见的HiveQL语句优化技巧。 7.3 任务:优化执行语句 ===== SLIDE 31 ===== 7.3 任务:优化执行语句 利用分区裁剪 避免全字段查询 连接查询中的MapJoin 分组聚合查询的过滤条件 连接查询中的NULL 在创建分区表时,应将查询中过滤频率较高的字段设置为分区字段,以便在执行查询时利用分区裁剪机制,减少数据扫描量、提升查询效率。 Hive默认开启了MapJoin优化策略,该策略在执行连接查询时,会将小表加载到内存中,在扫描大表的过程中完成匹配操作,避免产生大量Shuffle开销,提升查询性能。 在分组聚合查询时,过滤条件应优先放在WHERE子句中,而不是HAVING子句中。 在连接查询中,若不需要NULL参与匹配,应在ON子句中添加过滤条件,将关联字段中的NULL过滤掉。 在执行查询语句时,避免指定查询内容为*,而是仅指定需要的字段,减少I/O和数据传输量。 ===== SLIDE 32 ===== AI助学 学完本单元后,读者已经初步掌握Hive性能优化的基本方法,能够从存储优化、参数优化和HiveQL语句优化等方面理解提升查询效率的常见思路。然而,在实际分析任务中,查询执行缓慢的原因可能来自文件格式与压缩方式选择不当、参数配置不合理,也可能与HiveQL语句编写方式有关。对于初学者而言,往往难以根据执行现象判断应从哪个方面入手进行排查与优化。此时,可借助AI对查询场景、表结构、参数配置和HiveQL语句进行辅助分析,梳理优化思路,并提示可能存在的性能问题。 AI 助 学 ===== SLIDE 33 ===== 单元总结 本单元主要讲解了Hive优化。首先,介绍了数据存储优化方法;然后,讲解了配置参数优化方法;最后,讲解了执行语句优化方法。通过本单元的学习,读者能够根据业务需求选择合适的优化策略,从存储结构、参数配置及语句编写等方面全面提升Hive的查询性能与资源利用率。 单 元 总 结